# 这个模块是streamlit的网页，可以实现策略查看的功能，并且选择指定的策略进行回测或者实盘运行。
# 启动回测任务和实盘任务的组件为 from page_utils import launch_task_widget 这个函数。
# 对于每种策略，基础信息有: 策略名，策略参数说明的json，策略代码所在的文件夹以及其他合理的信息。
# 可以选定某种策略，可以查看这种策略代码所在文件夹的所有文件内容。
# 对于每种策略启动回测，除了指定这种策略参数说明列表种的参数外，还需要指定回测的时间范围，timeframe等。
# 对于每种策略启动实盘，需要指定这种策略运行的交易所，timeframe，停止时间等。


from backend.api import get_exchange, get_strategy_list
from backend.task_manager import launch_task
from page_utils import draw_form_params
import pandas as pd
import streamlit as st


# 主函数
def main():
    st.title("策略管理系统")
    st.write("选择策略，查看详情，并启动回测或实盘任务")

    # 示例策略列表
    strategy_list = get_strategy_list()
    rowid = st.dataframe(
        pd.DataFrame(strategy_list), on_select="rerun", selection_mode="single-row"
    )
    if not (rowid and rowid.selection.rows):
        return
    cid = rowid.selection.rows[0]
    strategy_info = strategy_list[cid]
    st.subheader(f"选择的策略种: {strategy_list[cid]['name']}")
    task_type = st.selectbox("任务类型", ["回测", "实盘"], index=0)
    if task_type == "回测":
        with st.form("backtest_form"):
            start_time = st.date_input("开始时间")
            end_time = st.date_input("结束时间")
            timeframe = st.selectbox("时间粒度", ["1m", "5m", "1h", "1d"])
            input_params = draw_form_params(strategy_info["params"])
            if st.form_submit_button("启动回测"):
                is_success, pid, msg = launch_task(
                    strategy_info["name"],
                    start_time,
                    end_time,
                    timeframe,
                    **input_params,
                )
                if is_success:
                    st.success(
                        f"成功创建回测任务: {strategy_info['name']}\n"
                        f"PID: {pid}\n"
                        f"MSG: {msg}"
                    )
                else:
                    st.error(
                        f"无法创建回测任务: {strategy_info['name']}\n" f"MSG: {msg}"
                    )

    elif task_type == "实盘":
        with st.form("live_trading_form"):
            exchange = st.selectbox("交易所", get_exchange())
            timeframe = st.selectbox("时间粒度", ["1m", "5m", "1h", "1d"])
            stop_time = st.date_input("停止时间")
            input_params = draw_form_params(strategy_info["params"])
            if st.form_submit_button("启动实盘"):
                is_success, pid, msg = launch_task(
                    strategy_info["name"],
                    exchange,
                    stop_time,
                    timeframe,
                    **input_params,
                )
                if is_success:
                    st.success(
                        f"成功创建实盘任务: {strategy_info['name']}\n"
                        f"PID: {pid}\n"
                        f"MSG: {msg}"
                    )
                else:
                    st.error(
                        f"无法创建实盘任务: {strategy_info['name']}\n" f"MSG: {msg}"
                    )


if __name__ == "__main__":
    main()
